module MainWindow (main) where

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.GC
import Graphics.UI.Gtk.ModelView.CellLayout
import Graphics.UI.Gtk.ModelView.CustomStore
import Data.IORef
import Data.Acid
import Customer
import MainHandler
import PerformedHaircut
import Haircut
import WindowAdministration
import CortesEspecificosDeUsuarioWindow
import WindowUtils
import WindowModifyCustomer
import Repositorium
 
main = do
  -- "levanto" la db en la variable state
  -- si no encuentra ningun punto de restauracion, comienza con el valor de parametor (emptyRepositorium en este caso)
  state <- openLocalState (emptyRepositorium)


  -- inicio la gui
  initGUI
  window <- windowNew
  window `onDestroy` closeApplication state
  windowSetPosition window WinPosCenter
  windowSetTitle window "Peluqueria Nombre Feliz"
  
  
  -- label con el nombre "Clientes"
  lab <- labelNew (Just "Clientes")
  
  -- combo que muestra todos los clientes
  combo <- comboCustomers state
  
  -- "administrative options" button
  buttonAdm <- buttonNewWithLabel "Opciones administrativas"
  
  buttonAdm `onClicked` (adminWindowAcid state combo)
  ------------------------------------------------
  

  -- modificar cliente
  buttonSrch <- buttonNewWithLabel "Modificar cliente" 
  buttonAddHaircut <- buttonNewWithLabel "Agregar Corte"
  buttonAddHaircut `onClicked` (cortesEspecificosDeUsuarioWindowAcid (getCustomerByIdAcid (comboBoxGetActive combo) state) state)
  
  
  
  
  -- box vertical para empaquetar cosas
  hbox <- vBoxNew False 5
  
  -- vox horizontal para juntar los botones de editar cliente y de agregar corte nuevo
  vboxEditarYAgregarCorte <- hBoxNew True 2
  boxPackStart vboxEditarYAgregarCorte buttonSrch PackNatural 0
  boxPackStart vboxEditarYAgregarCorte buttonAddHaircut PackNatural 0
  
  
  buttonSrch `onClicked` (windowModifyCustomerAcid ((getCustomerByIdAcid (comboBoxGetActive combo) state)) combo state)
  
  
  -- un separador
  sep <- hSeparatorNew
  
  -- Una etiqueta bonita
  (label1,frame1) <- myLabelWithFrameNew
  labelSetText label1 "Gestion de Peluqueria 'Nombre Feliz'"
  
  -- Decripcion del programa
  (label2,frame2) <- myLabelWithFrameNew
  labelSetText label2 "\nDiseniado por:\n-Charkiewicz Gaston N.\n-Matwiejczuk Lucas G.\n\nTodavia falta mucho por hacer...\n...porque queremos hacer las cosas bien!\n\nMateria:\nConstruccion de Interfaces de Usuario\n\n\n\n\n\n\n"
  labelSetJustify label2 JustifyCenter

  -- setear algunas propiedades de la ventana y agregar el container hijo
  -- (tambien se hace con containerAdd window child)
  set window [windowDefaultWidth := 300, windowDefaultHeight := 500,
              containerBorderWidth := 10, containerChild := hbox]
  
  -- packing
  boxPackStart hbox lab PackNatural 1
  boxPackStart hbox combo PackNatural 1
  boxPackStart hbox sep PackNatural 1
  boxPackStart hbox vboxEditarYAgregarCorte PackNatural 1
  boxPackStart hbox frame1 PackNatural 1
  boxPackStart hbox frame2 PackNatural 1
  boxPackEnd hbox buttonAdm PackNatural 1
  
  widgetShowAll window
  mainGUI

------------------------------------------------------------------------------------ 


comboCustomers state = do
    customers <- getCustomersAcid state
    store <- listStoreNew (customers)
    combo <- comboBoxEntryNewWithModel store
    customStoreSetColumn store textColumn (getCustomerName)
    comboBoxEntrySetTextColumn combo textColumn
  
    comboBoxSetActive combo 0
    return combo

textColumn :: ColumnId Customer String
textColumn = makeColumnIdString 0

----------------------PARA CERRAR LA BASE------------------------------------ 

closeApplication :: AcidState st -> IO ()
closeApplication state = do
                                mainQuit 
                                closeAcidState state

               